package com.gjy.disruptor.uuid.dec.disruptor;

import com.lmax.disruptor.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Disruptor事件处理器（消费者）。
 * 它从环形缓冲区中取出UuidEvent，并将其放入一个队列中供Netty处理器消费。
 *
 * @author gjy
 * @version 1.0
 * @since 2025-10-11 09:14:38
 */
public class UuidEventHandler implements EventHandler<UuidEvent> {
    private static final Logger log = LoggerFactory.getLogger(UuidEventHandler.class);
    // 使用一个阻塞队列来存储生成的UUID，供Netty处理器拉取。
    // 在高并发场景下，可能需要更复杂的缓冲策略。
    private final BlockingQueue<String> uuidQueue = new LinkedBlockingQueue<>();

    @Override
    public void onEvent(UuidEvent event, long sequence, boolean endOfBatch) {
        String uuid = event.getUuid();
        try {
            // 将生成的UUID放入队列
            uuidQueue.put(uuid);
            // logger.debug("Event handled and UUID queued: {}", uuid);
        } catch (InterruptedException e) {
            log.error("Interrupted while putting UUID to queue", e);
            Thread.currentThread().interrupt();
        }
    }

    /**
     * 供Netty处理器调用，以获取一个UUID。
     *
     * @return 生成的UUID字符串
     */
    public String takeUuid() throws InterruptedException {
        return uuidQueue.take(); // 阻塞直到有UUID可用
    }

}
